home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xmbase-grok-1.2 / form.h < prev    next >
Text File  |  1995-06-25  |  11KB  |  282 lines

  1. /*
  2.  * form and database definitions
  3.  */
  4.  
  5. /*
  6.  * the CARD data structure describes a card window on the screen. A card can
  7.  * be installed in any form widget. A card has two main parts: a form that
  8.  * describes the data types and visual layout, and a database that contains
  9.  * raw data as a matrix of strings. A card is the primary data structure of
  10.  * grok. It is not an individual card, but all cards plus an index which one
  11.  * is current. In addition to all that, there is some info about the widgets
  12.  * that were used to display the card and its items. The form and the dbase
  13.  * are the secondary data structures contained in the card. This split
  14.  * between form and database allows multiple representations of the same
  15.  * data, and also allows procedural databases that are not tied to a form.
  16.  *
  17.  * Note that if card->nquery > 0, query[card->qcurr] == card->row must be
  18.  * true; ie. the line highlighted in the summary list must be the card
  19.  * displayed in the card menu. This makes deleting cards a bit difficult.
  20.  */
  21.  
  22. typedef struct card {
  23.     struct form *form;    /* form struct that controls this card */
  24.     struct dbase*dbase;    /* database that callbacks use to store data */
  25.                 /****** summary window ***********************/
  26.     int        nquery;    /* # of valid row indices in query[] */
  27.     int        qcurr;    /* index into query[] for displayed card */
  28.     int        *query;    /* row numbers of cards that satisfy query */
  29.     Widget        wsummary;    /* summary list widget, for destroying */
  30.     Widget        wheader;    /* summary list header line, for destroying */
  31.     Widget        wsumshell;    /* shell that encloses wsummary */
  32.                 /****** card window **************************/
  33.     Widget        shell;    /* if nonzero, card has its own window */
  34.     Widget        wform;    /* form widget card is drawn into */
  35.     Widget        wcard;    /* child of wform card is drawn into */
  36.     Widget        wstat;    /* child of wform static part is drawn into */
  37.     int        row;    /* database row shown in card, -1=none */
  38.     int        nitems;    /* # of items, also size of following array */
  39.     struct carditem {
  40.        Widget   w0;        /* primary input widget, 0 if invisible_if */
  41.        Widget   w1;        /* secondary widget (card form, label etc) */
  42.     } items[1];
  43. } CARD;
  44.  
  45.  
  46. /*
  47.  * database header struct. A database is basically a big 2-D array of data
  48.  * pointers. A card is stored in a row; each item in the row is a column.
  49.  * Each row can have a different number of columns; to avoid frequent
  50.  * reallocs dbase->nmaxolumns is used as a hint for how many columns to alloc
  51.  * initially when a new row is created.
  52.  */
  53.  
  54. typedef struct section {
  55.     char    *path;        /* path name of file section was loaded from */
  56.     BOOL    rdonly;        /* no write permission for db file */
  57.     BOOL    modified;    /* TRUE if modified */
  58.     int    nrows;        /* # of cards in this section */
  59.     time_t    mtime;        /* modification time of file when read */
  60. } SECTION;
  61.  
  62. typedef struct row {
  63.     short    ncolumns;    /* # of columns allocated */
  64.     short    section;    /* section this row belongs to */
  65.     BOOL    selected;    /* for dbase_sort: restore query after sort */
  66.     char    *data[1];    /* <ncolumns> strings, allocated larger */
  67. } ROW;
  68.  
  69. typedef struct dbase {
  70.     BOOL    rdonly;        /* no write permission for any section */
  71.     BOOL    modified;    /* TRUE if any section was modified */
  72.     int    maxcolumns;    /* # of columns in widest row */
  73.     int    nrows;        /* # of valid rows in database */
  74.     int    size;        /* # of rows allocated */
  75.     short    nsects;        /* # of files loaded */
  76.     short    currsect;    /* current section, -1=all, 0..nsects-1=one */
  77.     SECTION    *sect;        /* describes all section files 0..nsects-1 */
  78.     BOOL    havesects;    /* db is a directory, >1 sections possible */
  79.     ROW    **row;        /* array of <nrows> rows */
  80. } DBASE;
  81.  
  82.  
  83. /*
  84.  * Form describe data types and graphical layout of a card. There is a
  85.  * header struct that describes global info such as the size of the card,
  86.  * and a list of item structs, each of which describes one item (one
  87.  * field, such as input areas, labels, pushbuttons etc).
  88.  *
  89.  * An item is a data entry in a form. It specifies what the entry does,
  90.  * what it looks like, when and how it can be edited by the user etc.
  91.  * When adding a field, provide defaults in item_add(), release malloced
  92.  * data in item_delete(), and provide a user interface in formwin.c.
  93.  */
  94.  
  95. typedef enum {            /*----- item type */
  96.     IT_NULL = 0,        /* terminates the list, null item */
  97.     IT_LABEL,        /* a text without function, must be 1st */
  98.     IT_PRINT,        /* inset text without function */
  99.     IT_INPUT,        /* arbitrary line of text */
  100.     IT_TIME,        /* date and/or time */
  101.     IT_NOTE,        /* multi-line text */
  102.     IT_CHOICE,        /* diamond on/off switch, one of many */
  103.     IT_FLAG,        /* square on/off switch, no restriction */
  104.     IT_BUTTON,        /* pressable button with script */
  105.     IT_VIEW,        /* database summary view */
  106.     IT_CHART,        /* graphical chart */
  107.     NITEMS
  108. } ITYPE;
  109.  
  110. typedef enum {            /*----- justification */
  111.     J_LEFT = 0,        /* default, left-justified */
  112.     J_RIGHT,        /* right-justified */
  113.     J_CENTER        /* centered */
  114. } JUST;
  115.  
  116. typedef enum {            /*----- standard font */
  117.     F_HELV = 0,        /* standard helvetica */
  118.     F_HELV_O,        /* standard helvetica oblique */
  119.     F_HELV_S,        /* small helvetica */
  120.     F_HELV_L,        /* large helvetica */
  121.     F_COURIER,        /* standard courier */
  122.     F_NFONTS
  123. } FONTN;
  124.  
  125. typedef enum {            /*----- IT_TIME formats */
  126.     T_DATE = 0,        /* date */
  127.     T_TIME,            /* time */
  128.     T_DATETIME,        /* date and time */
  129.     T_DURATION        /* duration */
  130. } TIMEFMT;
  131.  
  132.                 /* chart.*mode flags: */
  133. #define CC_NEXT        0    /* pos is next free to right/above */
  134. #define CC_SAME        1    /* pos is same as previous */
  135. #define CC_EXPR        2    /* pos/size is computed */
  136. #define CC_DRAG        3    /* pos/size is draggable */
  137.                 /* index into chart.value[] */
  138. #define    CC_X        0    /* X position */
  139. #define    CC_Y        1    /* Y position */
  140. #define    CC_XS        2    /* X size */
  141. #define    CC_YS        3    /* Y size */
  142.  
  143. typedef struct {        /*----- IT_CHART component */
  144.     BOOL    line;        /* replace bars with lines */
  145.     BOOL    xfat, yfat;    /* make bigger to touch neighbor */
  146.     char    *excl_if;    /* don't draw if this expr is true */
  147.     char    *color;        /* color 0..7 */
  148.     char    *label;        /* numeric label */
  149.     struct value {
  150.         int    mode;    /* one of CC_* */
  151.         char    *expr;    /* CC_EXPR: expression to eval */
  152.         int    field;    /* CC_DRAG: field number */
  153.         float    mul;    /* CC_DRAG: field * mul + add */
  154.         float    add;    /* CC_DRAG: field * mul + add */
  155.     } value[4];        /* x, y, xs, ys */
  156. } CHART;
  157.  
  158. typedef struct {        /*----- storage for visible chart bars */
  159.     float    value[4];    /* evaluated bar position and size */
  160.     int    color;        /* bar color 0..7 */
  161. } BAR;
  162.  
  163. typedef struct item {
  164.     ITYPE    type;        /* one of IT_* */
  165.     char    *name;        /* field name, used in expressions */
  166.     int    x, y;        /* position in form */
  167.     int    xs, ys;        /* total width and height */
  168.     int    xm, ym;        /* if multipart item, relative pos of split */
  169.     int    sumwidth;    /* width in summary listing if IN_DBASE */
  170.     int    sumcol;        /* column # in summary listing if IN_DBASE */
  171.     long    column;        /* database column #, 0 is first */
  172.     BOOL    search;        /* queries search this item */
  173.     BOOL    rdonly;        /* user cannot change this field */
  174.     BOOL    nosort;        /* user can sort by this field */
  175.     BOOL    defsort;    /* sort by this field when loading file */
  176.     BOOL    selected;    /* box is selected in form editor */
  177.                 /*----- common */
  178.     char    *label;        /* label string */
  179.     JUST    labeljust;    /* label justification */
  180.     int    labelfont;    /* label font, F_* */
  181.                 /*----- TIME */
  182.     TIMEFMT    timefmt;    /* one of T_DATE..T_DURATION */
  183.                 /*----- CHOICE, FLAG */
  184.     char    *flagcode;    /* dbase column value if on */
  185.     char    *flagtext;    /* text shown in summary if on */
  186.                 /*----- conditionals */
  187.     char    *gray_if;    /* if expr is true, turn gray */
  188.     char    *freeze_if;    /* if expr is true, don't permit changes */
  189.     char    *invisible_if;    /* if expr is true, make invisible */
  190.     char    *skip_if;    /* if expr is true, cursor skips field */
  191.                 /*----- for INPUT, DATE, TIME, NOTE */
  192.     char    *idefault;    /* default input string */
  193.     char    *pattern;    /* regexp that input string must match */
  194.     int    minlen;        /* min length of input field */
  195.     int    maxlen;        /* max length of input field */
  196.     JUST    inputjust;    /* input field justification */
  197.     int    inputfont;    /* input font, F_* */
  198.                 /*----- for BUTTON */
  199.     char    *pressed;    /* command that button execs when pressed */
  200.     char    *added;        /* command that button execs when added */
  201.                 /*----- for CHART */
  202.     float    ch_xmin;    /* coord of left edge */
  203.     float    ch_xmax;    /* coord of right edge */
  204.     float    ch_ymin;    /* coord of bottom edge */
  205.     float    ch_ymax;    /* coord of top edge */
  206.     BOOL    ch_xauto;    /* automatic xmin/xmax */
  207.     BOOL    ch_yauto;    /* automatic ymin/ymax */
  208.     float    ch_xgrid;    /* vert grid lines every xgrid units */
  209.     float    ch_ygrid;    /* horz grid lines every ygrid units */
  210.     float    ch_xsnap;    /* snap X to nearest xsnap */
  211.     float    ch_ysnap;    /* snap Y to nearest ysnap */
  212.     float    ch_xlabel;    /* X axis label every xlabel units */
  213.     float    ch_ylabel;    /* Y axis label every ylabel units */
  214.     char    *ch_xexpr;    /* X axis label expression */
  215.     char    *ch_yexpr;    /* Y axis label expression */
  216.     int    ch_ncomp;    /* # of components in ch_comp */
  217.     int    ch_curr;    /* current component index */
  218.     CHART    *ch_comp;    /* component array */
  219.     BAR    *ch_bar;    /* nrows * ncomp bars, ncomp-major order */
  220.     int    ch_nbars;    /* number of bars in ch_bar array */
  221.                 /*----- for VIEW */
  222.     char    *database;    /* which database to search */
  223.     char    *query;        /* query to do */
  224.     BOOL    qsummary;    /* print summary */
  225.     BOOL    qfirst;        /* print first card */
  226.     BOOL    qlast;        /* print last card */
  227. } ITEM;
  228.  
  229.  
  230. /* TRUE if the item type accesses some database field */
  231.  
  232. #define IN_DBASE(t) (t==IT_INPUT || t==IT_TIME ||\
  233.              t==IT_NOTE  || t==IT_CHOICE || t==IT_FLAG)
  234.  
  235.  
  236. /*
  237.  * form data structure. The form defines which items are stored in the
  238.  * database, and how the data is being displayed. This is the database
  239.  * header describing one card. The actual database information will be
  240.  * used to fill in data into the card, according to the formatting info
  241.  * in the item structures. The order of items in items[] is the order
  242.  * on screen, top->bottom then left->right. Each item has a data index
  243.  * that specifies the data order in the database, which can be different
  244.  * if the card was re-arranged or items were inserted.
  245.  * If you change something here, also change form_create(), form_delete(),
  246.  * and the user interafe in formwin.c.
  247.  * (In the menus, "item" has been renamed to "field".)
  248.  */
  249.  
  250. typedef struct dquery {
  251.     BOOL    suspended;    /* if TRUE, remove from pulldown */
  252.     char    *name;        /* name of query, for query pulldown */
  253.     char    *query;        /* query expression for evaluate() */
  254. } DQUERY;
  255.     
  256. typedef struct form {
  257.     char    *path;        /* complete path name form was read from */
  258.     char    *name;        /* filename of form */
  259.     char    *dbase;        /* referenced database filename */
  260.     char    *comment;    /* user-defined comment */
  261.     char    *help;        /* help text */
  262.     char    cdelim;        /* column delimiter in database file */
  263.     BOOL    rdonly;        /* don't allow writing to database */
  264.     BOOL    proc;        /* procedural */
  265.     int    xg, yg;        /* grid size in pixels */
  266.     int    xs, ys;        /* total size of form in pixels */
  267.     int    ydiv;        /* Y of divider between static part and card */
  268.     int    size;        /* # of items the item array has space for*/
  269.     int    nitems;        /* # of items in this form */
  270.     ITEM    **items;    /* array of item definitions */
  271.     int    nqueries;    /* # of queries in query array */
  272.     int    autoquery;    /* query to do when loading, -1=none */
  273.     DQUERY    *query;        /* default queries for query pulldown */
  274. } FORM;
  275.  
  276.  
  277. /*
  278.  * for the parser, variable argument list element
  279.  */
  280.  
  281. struct arg { struct arg *next; char *value; };
  282.